//
//  ViewController.m
//  copy内存管理
//
//  Created by wenjim on 17/10/26.
//  Copyright © 2017年 WenJim. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /*
     内存管理原则：
     一次 alloc 对应一次 release
     一次 retain 对应一次 release
     一次 copy 对应一次 release
     有加就有减
     
     总结：
     如果是浅拷贝：不会生成新的对象，但是系统会对原来的对象进行retain，所以需要对原来的对象进行一次release
     如果是深拷贝： 会生成新的对象，系统部不会对原来的对象进行retain，但是因为生成了新的对象，所以我们需要对新的对象进行release
     */
    
    // 1. 创建一个不可变字符串
    NSString * str = [[NSString alloc] initWithFormat:@"cwj"];
    NSLog(@"str = %lu",[str retainCount]);
    
    
    /*
    // 不会生成新的对象，但是需要注意，正是因为不会生成新的对象，所以系统会对以前的对象进行一次retain
    // 如果是浅拷贝，那么系统就会对原来的对象进行retain
    NSString * str2 = [str copy];
    NSLog(@"str = %lu",[str2 retainCount]);
    
    
    [str release];
    [str release];
     */
    
    // 深拷贝，会生成新的对象，正是因为会生成新的对象，所以系统不会对以前的对象进行一次retain，但是因为生成了新的对象，所以我们需要对新的对象进行release
    NSMutableString * strM = [str mutableCopy];
    NSLog(@"str = %lu",[str retainCount]);
    NSLog(@"strM = %lu",[strM retainCount]);
    NSLog(@"%p - %p",str, strM);
    
    [strM release];
    [str release];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
